import 'dart:io';
import 'package:cloud_music/core/services/service_url.dart';
import 'package:cloud_music/core/services/user/user_request.dart';
import 'package:cloud_music/ui/widgets/loading.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

/*
 * 全局 网络请求管理
 * https://blog.csdn.net/u012304076/article/details/96481926
 */
class NetUtils {
  // 单例, 全局请求拦截
  static Dio _dio;

  static void init() async {
    // https://www.jianshu.com/p/bd4c2dc5e97f#cookie%E7%AE%A1%E7%90%86
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;
    //本地持久化 cookie, 默认保存在内存中
    CookieJar cj = PersistCookieJar(dir: tempPath);
    _dio = Dio(BaseOptions(baseUrl: ServiceUrl.baseUrl))
      // 在进行请求中需要拦截cookie来自动管理请求/响应cookie
      ..interceptors.add(CookieManager(cj))
      //网络请求中查看日志  日志拦截器
      ..interceptors.add(LogInterceptor(responseBody: true, requestBody: true));
  }

  // 通用get请求 请求示例,见最下方注释
  static Future<Response> get(
    BuildContext context,
    String url, {
    Map<String, dynamic> params,
    bool isShowLoading = true,
  }) async {
    // 加载框
    if (isShowLoading) Loading.showLoading(context);
    try {
      return await _dio.get(url, queryParameters: params);
    } on DioError catch (e) {
      if (e == null) {
        return Future.error(Response(data: -1));
      } else if (e.response != null) {
        if (e.response.statusCode >= 300 && e.response.statusCode < 400) {
          UserRequest.reLogin();
          return Future.error(Response(data: -1));
        } else {
          return Future.value(e.response);
        }
      } else {
        return Future.error(Response(data: -1));
      }
      // //捕获了 DioError，然后判断接口是否还返回了正常的内容
      // if (e.response is Map) {
      //   // 状态码不为2xx，但是仍然返回了数据，这样 Dio 是会抛出 DioError 的，需要我们自己捕获来处理。
      //   return Future.value(e.response);
      // }
      // // 如果不是正常的数据，则直接抛出 Future.error(0)
      // return Future.error(0);
    } finally {
      Loading.hideLoading(context);
    }
  }

  //
}

/**
 * // https://blog.csdn.net/qq_23756803/article/details/102384092
 // 新碟上架
static Future<AlbumData> getAlbumData(
  BuildContext context, {
    Map<String, dynamic> params = const {
      'offset': 0,
      'limit': 10,
    },
  }) async {
  var response = await _get(context, '/top/album', params: params);
  return AlbumData.fromJson(response.data);
}
 */
